/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package facade;

import java.awt.Component;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPasswordField;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import persistencia.InterfazPersistencia;

/**
 *
 * @author carlos
 */
public class InterfazFacade 
{
    private JButton grabar;
    private JButton cancelar;
    private JButton nuevo;
    private JButton editar;
    private JButton eliminar;
    
    private JTable tabla;
    private JTextField txtBusqueda;
    private int estado; //0=sinAsignar,1=nuevo,2=editar,3=eliminar,4=grabar
    
    private InterfazPersistencia entidad;
    private TableFacade tablaModelo;
    private ArrayList<Component> listaCampos;
    private InterfazCrearObjeto objeto;
    

    public InterfazFacade(JButton grabar, JButton cancelar, JButton nuevo, JButton editar, JButton eliminar,JTable tabla,JTextField txtBusqueda,InterfazPersistencia entidad,InterfazCrearObjeto objeto) {
        this.grabar = grabar;
        this.cancelar = cancelar;
        this.nuevo = nuevo;
        this.editar = editar;
        this.eliminar = eliminar;
        this.tabla=tabla;
        this.txtBusqueda=txtBusqueda;
        this.entidad=entidad;
        this.estado=0;
        listaCampos=new ArrayList<Component>();
        habilitarCampos(false);
        this.grabar.setEnabled(false);
        this.cancelar.setEnabled(false);
        this.tablaModelo=new TableFacade(entidad);
        this.tabla.setModel(tablaModelo);
        this.objeto=objeto;
        limpiarDatos();
        
    }

    
    
    public void nuevo()
    {
        this.estado=1;
        grabar.setEnabled(true);
        cancelar.setEnabled(true);
        nuevo.setEnabled(false);
        editar.setEnabled(false);
        eliminar.setEnabled(false);
        tabla.setEnabled(false);
         habilitarCampos(true);
         limpiarDatos();
    }

    public void editar()
    {
        this.estado=2;
        grabar.setEnabled(true);
        cancelar.setEnabled(true);
        nuevo.setEnabled(false);
        editar.setEnabled(false);
        eliminar.setEnabled(false);
        tabla.setEnabled(false);
         habilitarCampos(true);
         traspasarValores();
    }
    
    public void eliminar()
    {
        traspasarValores();
        this.entidad=objeto.getObjeto();
        this.estado=3;
        entidad.eliminar();
        this.estado=0;
        this.tablaModelo.cargarDatos();
    }
    
    public void grabar()
    {
        this.entidad=objeto.getObjeto();
        if(this.estado==1)
        {
            entidad.grabar();
        }
        
        if(this.estado==2)
        {
            entidad.editar();
        }
        
        
         habilitarCampos(false);
        grabar.setEnabled(false);
        cancelar.setEnabled(false);
        nuevo.setEnabled(true);
        editar.setEnabled(true);
        eliminar.setEnabled(true);
        tabla.setEnabled(true);
        this.estado=0;
        this.tablaModelo.cargarDatos();
    }
    
    public void cancelar()
    {
        grabar.setEnabled(false);
        cancelar.setEnabled(false);
        nuevo.setEnabled(true);
        editar.setEnabled(true);
        eliminar.setEnabled(true);
        tabla.setEnabled(true);
        this.estado=0;
        habilitarCampos(false);
        limpiarDatos();
    }

    public void agregarCampos(Component c)
    {
        c.setEnabled(false);
        listaCampos.add(c);
    }
    
    
    public void habilitarCampos(Boolean opcion)
    {
        for (Iterator<Component> it = listaCampos.iterator(); it.hasNext();) {
            Component component = it.next();
            if(opcion)
            {
                component.setEnabled(true);
            }
            else
            {
                component.setEnabled(false);
            }
        }
    }
    
    public void limpiarDatos()
    {
        for (Iterator<Component> it = listaCampos.iterator(); it.hasNext();) {
            Component component = it.next();
            
            if(component instanceof JTextField)
            {
                JTextField obj=(JTextField) component;
                obj.setText("");
            }
            
            if(component instanceof JComboBox)
            {
                JComboBox obj=(JComboBox) component;
                obj.setSelectedIndex(0);
            }
            
            if(component instanceof JTextArea)
            {
                 JTextArea obj=(JTextArea) component;
                 obj.setText("");
            }
            
            if(component instanceof JPasswordField )
            {
                 JPasswordField obj=(JPasswordField) component;
                 obj.setText("");
            }
            
        }
    }

    public TableFacade getTabla() {
        return tablaModelo;
    }
    
    public void traspasarValores()
    {
        int columna=0;
        int fila=tabla.getSelectedRow();
        for (Iterator<Component> it = listaCampos.iterator(); it.hasNext();) {
            Component component = it.next();
            
            if(component instanceof JTextField)
            {
                JTextField obj=(JTextField) component;
                obj.setText(tablaModelo.getValueAt(fila,columna).toString());
            }
            
            if(component instanceof JComboBox) //falta completar para que busque la opcion en el conjunto
            {
                JComboBox obj=(JComboBox) component;
                obj.setSelectedIndex(0);
            }
            
            if(component instanceof JTextArea)
            {
                 JTextArea obj=(JTextArea) component;
                 obj.setText(tablaModelo.getValueAt(fila,columna).toString());
            }
            
            if(component instanceof JPasswordField )
            {
                 JPasswordField obj=(JPasswordField) component;
                 obj.setText(tablaModelo.getValueAt(fila,columna).toString());
            }
            
           columna++;
                    
        }
    }
    
    public void buscar()
    {
        if(this.txtBusqueda.getText().equals(""))
        {
            tablaModelo.cargarDatos();
        }
        else
        {
            tablaModelo.filtroDatos(this.txtBusqueda.getText());
        }
        
    }
    
}
